from flask import Flask, render_template, current_app, request \
    , make_response, redirect, abort

app = Flask(__name__)

@app.route('/index')
def index():
    return 'Hello, World!'

@app.route('/hello', methods=['GET'])
def hello():
    user = {
        'name': '张三'
    }
    return render_template('hello.html', user=user)

@app.route('/user/')
@app.route('/user/<page>')
def list_user(page=None):
    if not page:
        page = 1
    return '您好, 你是第{}页用户'.format(page)

@app.route('/index2')
def index2():
    print(app)
    print(current_app)
    print(app == current_app) # 内容相同，地址不同
    print(app is current_app)
    return 'index2'

@app.route('/test/req')
def test_request():
    """请求报文练习"""
    args = request.args
    method = request.method
    # 页码，默认为1
    page = request.args.get('page', 1)
    ip = request.remote_addr
    print(request.authorization)
    print(ip)
    # 解析请求头的ip
    print('ip地址:%s' % request.headers.get('Host').split(':')[0])
    print('args= {}, method={}'.format(args,method))
    print('args= %s,method=%s' % (args, method))
    return 'request success.'

app.add_url_rule('/home', view_func=hello )

# url映射
print(app.url_map)

@app.before_first_request
def first_request():
    """服务器启动后第一个请求到达"""
    print("first request")


@app.before_request
def first_request():
    """每一个请求到达前"""
    print("before request")


@app.route('/test/resp')
def test_response():
    # return 'response success', 200, {
    #     'user_id': 'my_user_id'
    # }
    resp = make_response('这是一个响应对象', 200, {
        'token': 'abc123'
    })
    resp.headers['user_id'] = '123'
    resp.status_code = 201
    # 响应html
    html = '<html><body><h1 style="color: #f00">HTML文本显示</h1></body></html>'
    resp = make_response(html)
    return resp


@app.route('/test/html')
def test_html():
    """从文件中响应html"""
    user = {'name':"李四"}
    html = render_template('hello.html', user=user)
    resp = make_response(html,400)
    return resp


@app.route('/')
def hello_world():
    """视图函数, 访问/时重定向到/index """
    abort(403)
    # return redirect('/index')


@app.errorhandler(403)
def forbidden_page(err):
    """你没有访问权限的页面"""
    print(err)
    return "您没有访问权限，请联系管理员开通"


if __name__ == '__main__':
    app.run(debug=True,port=8001)


""" 
    启动方式：
        步骤一：设置环境变量
         win：sets FLASK_APP=app.py
         *inux: export FLASK_APP=app.py
        步骤二：启动命令
         flask run --host =0.0.0.0 --port 5000 或 flask run -h 0.0.0.0 -p 5000
    
    命令运行：
    flask --app 01_flask run -p 8080 -h '0.0.0.0' --debug 
    
    MTV模型介绍
    model - template - view
    
    flask 扩展
        如何使用Flask扩展？
        *一搜：不要重复造轮子
        *二看：查看文档、资源库
        *三用：对照文档用 
        
    应用上下文，也称为 程序上下文。
                current_app 当前应用实例  
                g 处理请求时的临时存储对象，每次请求都会重设这个变量
    请求上下文
                request 请求对象，封装了客户端发出的http请求的内容
                        method：请求类型 GET/POST/OPTIONS/DELETE等
                        form: POST请求数据dict
                        args: GET请求数据dict
                        values：POST请求和GET请求数据集合dict
                        files：上传文件数据dict
                        cookies：请求中的cookie dict
                        headers：HTTP请求头
                        
                请求报文：
                  请求勾子：
                    before_first_request
                     服务器初始化后第一个请求到达前执行
                    before_request
                     每一个请求到达前执行
                    after_request
                     每次请求处理完成后执行，如果请求过程中产生了异常，则不执行
                    teardown_request
                     每次请求处理完成后执行，如果请求过程产生了异常也执行
                        
                response 
                     可以是字符串
                     可以是元组
                     
                    响应元组
                        response -- 响应内容
                        status  -- 响应状态码
                        headers -- 响应头信息
                    
    在分派请求之 前激活应用上下文和请求上下文；在请求处理完成后将其删除
    
    重定向: redict
    abort(404)
"""